from flask import Blueprint,request,make_response,jsonify,redirect
from flask_restful import Resource,Api
from utils.captcha.captcha import captcha
from utils.Myredis import r
import json
from utils.comm import send_message
import random
from application.models.users.user import *
from application.models.users.user import db
import time
from utils.Myjwt import myjwt
import functools,time
login_blue=Blueprint("login",__name__)
api=Api(login_blue)

# 权限认证
# def islogin(func):
#     @functools.wraps(func)
#     def wrapper():
#         start=int(time.time())
#         func()
#         end=int(time.time())
#         print("执行了"+str(end-start))
#         return func
#     return wrapper

def islogin(type):
    def pemistion(func):
        def wrapper():
            func()
            if type==1:
                return redirect("http://www.baidu.com")
            else:
                return redirect("http://www.jd.com")
        return wrapper
    return pemistion

@login_blue.route("/test")
@islogin(1)
# @islogin(2)
def test():
    print("执行test")
    return jsonify({"code":200,"msg":"msg"})
# 获取图片验证码
@login_blue.route("/getimg")
def getimg():
    # 调用captcha生成图片验证码
    name,text,img=captcha.generate_captcha()
    # 存入redis字符串 key:uuid value:text
    uuid=request.args.get("uuid")
    # 存入redis
    r.str_setex(uuid,text,300)
    res=make_response(img)
    # 以流的方式生成图片验证码
    res.headers["Content-Type"]="image/jpg"
    return res

# 发送短信验证码
@login_blue.route("/sms",methods=["POST"])
def sms():
    # 获取参数
    data=json.loads(request.data)
    mobile=data["mobile"]
    uuid=data["uuid"]
    imagecode=data["imagecode"]
    if not all([mobile,uuid,imagecode]):
        return jsonify({"code":401,"msg":"参数不完整"})
    # 验证图片验证码
    code=r.get_str(uuid)
    # 通过uuid从redis取出来和传递过来的参数进行对比，全部转为小写
    if code:
        if imagecode.lower()==code.lower().decode():
            # 验证一分钟之内只能发送一次
            mcode=r.get_str(mobile)
            if mcode:
                return jsonify({"code":403,"msg":"一分钟只能发送一次"})
            # 生成随机数
            scode=str(random.randint(1000,9999))
            print(scode)
            # 调用短信平台
            flag=send_message(mobile,scode)
            print('.......asddddddddd',flag)
            # if flag==True:
            # 存入redis
            r.add_str(mobile,scode)
            # 清除redis中的图片验证码
            r.del_key(uuid)
            # 返回结果
            return jsonify({"code": 200, "msg": "发送成功"})
            # else:
            #     return jsonify({"code": 403, "msg": "发送验证码失败"})
        else:
            return jsonify({"code":402,"msg":"图片验证码不正确"})
        # 失败返回错误信息
    else:
        return jsonify({"code":403,"msg":"验证码不存在"})

# 登陆
@login_blue.route("/login",methods=["POST"])
def login():
    # 获取参数
    data=json.loads(request.data)
    if data:
        mcode=data["mcode"]
        mobile=data["mobile"]
        # 根据手机号去redis获取验证码
        code=r.get_str(mobile)
        print("rrrrrrr",code)
        if code:
            # 验证码是否相同
            if int(code)==int(mcode):
                # 如果相同查询数据库user表，存在返回信息
                u=User.query.filter(User.mobile==mobile).first()
                if u:
                    # 删除redis中的验证码
                    r.del_key(mobile)
                # 不存在写入用户表
                else:
                    u=User(mobile=mobile,nikename=mobile)
                    db.session.add(u)
                    db.session.commit()
                token = myjwt.jwt_encode({"data": {"userid": u.id ,"mobile": u.mobile, "exptime": int(time.time())}})
                return jsonify({"code": 200, "msg": "登陆成功","token":token,"userid":u.id})
            else:
                return jsonify({"code":201,"msg":"验证码错误"})
        else:
            return jsonify({"code":200,"msg":"验证码过期"})